
/*
*Pool Public Licence version 0.1 or later
*Released on 20th April 2008.
*Any voilations can be repoted at paritosh@wikiocean.net
*What is treated as voilations can be found at www.wikiocean.net/ppl1-voilations* 
******************************************************************************
* The contents of this file are subject Affero GPL v3 and later with additional conditions.
* The additional conditions are to be considered as part of the Affero GPL v3 and later.
* The additional conditions will supersede the Affero GPLv3 and later in case of conflict.
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.gnu.org/licenses/agpl.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Initial Developer of the Original Code is Paritosh Pungaliya.
* created by Paritosh Pungaliya are Copyright (C) Paritosh Pungaliya; All Rights Reserved.
* Contributions are Copyright (C) 2001-2008 Paritosh Pungaliya.

* Objective of the additional terms (license) 
* 1) Is to extend the software freedom to freedom to work.
* 2) To ensure that knowledge is free from monopoly of agencie(s).
* 3) To avoid a situation where big corporates or investors can buy out free software groups and companies and then start milking the communities built around it.
* (this trend can be seen how the openness changes in companies that get Venture Capital funding.)
* (if you agree to this logic I invite you to our group to work together)

* Additional conditions
*  0) Source code will also include
* 	a) data dictionaries, data ontologies which are used to alter the behavior of code or to control           the features of application.
* 	b) Any code generated or derived automatically or manually from this code or logic
*  1) The revenue generated by deploying, implementing , selling services and other activities
*  	 based on this source code should be shared 100%, between the people working on it.
*  2) Capital invested should be given only fixed rate of return or linked to revenue/surplus growth for limited time.
*  3) People working on the project should always have an option to replace the capital provider in full or part with lower cost capital.
*  4) Their should not be any ownership which can be sold as a claim on future profit to be generated from the work of people working on the code.
*  5) Brand thus generated should belong to the group.
*  6) For old and new members revenue sharing should be equal for same work equivalent.
*  7) The share of revenue should be decided by bidding for work before allocation of work within the group.
*  8) Before bidding various method of measuring the work should be clearly defined and published in public domain. Any change in process should also be publised in public domain imediately.
*  9) All data related to to revenue sharing should be published as and when generated in public domain.
*  10) For group of people having size more than 10 people will have to make it open online for others to participate in bids. 
*  11) All people involved in related and sub project will be treated as a group.
*  12) Once this license is being used for a certain code then all and any other software services being provided by the group should complusorilly come under 100% revenue sharing.
*  13) Cross subsidization should not happen under this revenue share, no additional benefit should be drawn from the people, by the employing agency.
*  14) Any position or knowledge or legal structure created relating to people working on code, which adversely affects the spirit of 100% revenue share will be treated as a violation.
*  15) Revenue sharing defined.
*     a) includes direct revenue and also intangible gains like brand, and organization.
*     b) No personal judgment should be involved in judging the distribution of revenue.It has to be pre-defined formula based.
*     c)100% of revenue should be shared before expenses and recievers should have control over what expenses to incur.
*     d)For the work done in any month by contributing group member, working on any project can be given revenue share from the work done by the group, for a maximum of 18 months after that month.
*     e)Revenue should be apportioned to the month in which work is done and not when received.
*  The group fulfilling the above conditions also has to be a wiki ecosystem further defined in www.wekosystem.org or read about Wekosystem at www.wikiocean.net

*  ******************************************************************************
*/  
package pool.tablename;


import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import timer.ExecutionTimer;
import timer.TimerRecordFile;

import utility.MessageGenerator;

import dbmanager.DBManager;
import dbmanager.GetIdName;

public class Rate_master extends SubPool
{
	private String tableName = "rate_master";
	private String FROMDATE = "fd";
	private String TODATE = "td";
	private String ITEM = "item";
	private String BUYSELL = "buysell";
	private String USERGROUP = "usergroup";
	private String request;//,msg;
	
	public Hashtable<Object,Object> RateMap = new Hashtable<Object,Object>();
	private Hashtable<Object,Object> ViewHashtable = new Hashtable<Object, Object>();
	
	private Vector<Object> RateList =  new Vector<Object>(); /** Vector for storing number of rate_master object for multiple properties.*/
	private GetIdName gin;
	//private ResultSet rs;
	//private Hashtable<Object,Object> newRateMap;
	
	public Rate_master()
	{ 
		ExecutionTimer t = new ExecutionTimer();
		 t.start();
		sqlDB = new DBManager();
		sqlDB.getConnect();
		gin = new GetIdName(sqlDB);
		t.end();
		@SuppressWarnings("unused")
		TimerRecordFile timerFile=new TimerRecordFile("pool.tablename","Rate_master","Rate_master",t.duration());
	}
	
	public Rate_master(String request, String message, String tableName, DBManager sqlDB, String process) 
	{
		ExecutionTimer t = new ExecutionTimer();
		 t.start();
		this.request=request;
		this.message=message;
		this.tableName=tableName;
		this.sqlDB = sqlDB;
		this.process=process;
		gin = new GetIdName(sqlDB);
		System.out.println("pool::Rate::Rate()::The message in the Rate_Master is : "+message);
		t.end();
		@SuppressWarnings("unused")
		TimerRecordFile timerFile=new TimerRecordFile("pool.tablename","Rate_master","Rate_master",t.duration());
	}

	public Rate_master(DBManager sqldb)
	{	
		ExecutionTimer t = new ExecutionTimer();
		 t.start();
		this.sqlDB = sqldb;
		gin = new GetIdName(sqldb);
		t.end();
		@SuppressWarnings("unused")
		TimerRecordFile timerFile=new TimerRecordFile("pool.tablename","Rate_master","setNewPropertyVector",t.duration());
	}	
	
	
	@SuppressWarnings("unchecked")
	public StringBuffer getInsert()
	{
		ExecutionTimer t = new ExecutionTimer();
		 t.start();
		 
		System.out.println("pool::Rate_master::getInsert()::");
		for(int x=0;x<RateList.size();x++)
		{
			RateMap = (Hashtable<Object, Object>)RateList.get(x);
			RateMap.put("type", "ratemaster");
			Hashtable<Object, Object>  Error =new Hashtable<Object, Object>();
			Error.putAll(process());
			if(Error.containsKey("ErrorInput"))
			{
				return new StringBuffer(Error.toString());
			}
			RateMap.remove("type");
			//Init prev rate master
			 Hashtable<Object, Object> prevRateMap = new Hashtable<Object, Object>();
			 try
			 {
				 prevRateMap.put(ITEM, RateMap.get(ITEM));
				 prevRateMap.put(BUYSELL, RateMap.get(BUYSELL));
				 prevRateMap.put(USERGROUP, RateMap.get(USERGROUP));
				 prevRateMap.put(TODATE, "null");
			 } 
			 catch (Exception e1) 
			 {
				 System.out.println("pool::Rate::getInsert():: RateMap :"+RateMap+" Mandatory columns are not added");
				 sbrDTB.append("Mandatory columns are not added.. "+RateMap);
				 
				 flagResult = false;
			 }
			 //prevRateMap.put(TODATE, "0000-00-00 00:00:00");
		
			 if(RateMap.containsKey(TODATE)==false)
			 {
				 RateMap.put(TODATE, "null");
			 }
			 try 
			 {
			//UPDATING TO DATE FOR SAME ITEM PRESENT IN MASTER WHOSE TO DATE COL IS no$
			
				 ResultSet rs = sqlDB.getselect(prevRateMap, tableName);
				 rs.next();
			
				 String temp = rs.getString("Item");
				 System.out.println("pool::Rate::getInsert():: Checking prev RateMaster "+temp);
			
				 Hashtable<Object, Object> prevNewRateMap = new Hashtable<Object, Object>();
				 prevNewRateMap.putAll(prevRateMap);
				 String pattern = "yyyy-MM-dd HH:MM:ss";
				 SimpleDateFormat sdm = new SimpleDateFormat(pattern);
				 String date = sdm.format(new Date());
				 prevNewRateMap.put(TODATE, date);
				 sqlDB.getUpdate(tableName, prevNewRateMap, prevRateMap);			
				 RateMap.put(FROMDATE, date);
			
				 //CHECKING AVAILABILITY OF DATA OR RETRIVING FROM AVAILABLE INFORMATION
				 ResultSetMetaData data = rs.getMetaData();
				 int i=0;
				 while(i!=data.getColumnCount())
				 {
					 try 
					 {
						 String col = data.getColumnName(i+1).toLowerCase();
						 if(col.equals("id"))
						 {
							 i++;
							 continue;
						 }
						 if(RateMap.containsKey(col)==false)
						 {
							 RateMap.put(col, rs.getString(col));
						 }
						 i++;
					 }
					 catch (Exception e) {
						 i++;
					 }
				 }
			 }
			 catch (SQLException e) {
			 }
			 RateMap.put("id","0");
			 //INSERTING NEW RATE IN DATABASE
			 int j = sqlDB.getInsert(tableName,RateMap);
			 if(j>0)
			 {
				 System.out.println("pool::Rate::getInsert():: RateMap :"+RateMap);
				 sbrDTB.append("Rate is added successfully : "+RateMap);
				 
				 flagResult = true;
			 }
			 else
			 {
				 System.out.println("pool::Rate::getInsert():: RateMap :"+RateMap);
				 sbrDTB.append("Unable to Add rates : "+RateMap);
				 
				 flagResult = false;
			 }
			 
			 if(flagResult == true)
					continue;
				else
					break;
	
		 }
		t.end();
		@SuppressWarnings("unused")
		TimerRecordFile timerFile=new TimerRecordFile("pool.tablename","Rate_master","getInsert",t.duration());
		 return sbrDTB;	
	}
	
	
	public StringBuffer getUpdate()
	{
		return sbrDTB;
	}

	
	@SuppressWarnings("unchecked")
	public StringBuffer getView() 
	{
		ExecutionTimer t = new ExecutionTimer();
		 t.start();
		StringBuffer sbrProperty=new StringBuffer();
		MessageGenerator msg=new MessageGenerator(sqlDB);
		/*Command cp = new Command(tableName, sqlDB);
		RateMap = cp.getHashCommand(tableName,message,process); 
		if(RateMap.containsKey("ErrorInput"))
		{
			sbrProperty.append(RateMap.get("ErrorInput"));
			return sbrProperty;
		}
		
		RateMap = gin.getHashMapOfValues(RateMap);
		RateMap=gin.convertMasterId(RateMap, tableName, process);*/
		
		RateMap.putAll(ViewHashtable);		
		
		Vector<Object> VRate  = new Vector<Object>(); 		
		
		Enumeration< Object> enum1 = RateMap.keys();
		if(enum1.hasMoreElements()==false)
		{
				sbrProperty.append("Enter condition to view the properties");				
				return sbrProperty;
		}
		
		VRate.addAll(sqlDB.getSelectVector(RateMap, tableName));
		if(VRate.isEmpty())
		{
			sbrProperty.append("Record not available");
			return sbrProperty;
		}
		String RateProperties="";
		Vector<Object> heading = new Vector<Object>();
		StringBuffer Field =new StringBuffer();
		for(int j=0;j<VRate.size();j++)
		{
			
			String RateProperty="";
			Hashtable<Object, Object> TdplObj=new Hashtable<Object, Object>();
			TdplObj=(Hashtable<Object, Object>) VRate.get(j);
			Enumeration<Object> enumer = TdplObj.keys();
			while(enumer.hasMoreElements())
			{
				String key = enumer.nextElement().toString();
				String value = TdplObj.get(key).toString();
				if(!heading.contains(key))
					heading.add(key);
				Field.append(value+"\t");
			}
			Field.append("\n");
			//RateProperty=msg.convertToMessage(tableName, process, TdplObj);
			//RateProperties=RateProperties+RateProperty;
			//int k=j+1;
			System.out.println("Request is     "+RateProperties);
			//sbrProperty.append("    Property "+k+ " : ");
			//sbrProperty.append(RateProperties);
		}
		for(int i=0;i<heading.size();i++)
		{
			sbrProperty.append(heading.get(i)+"\t");
		}
		t.end();
		@SuppressWarnings("unused")
		TimerRecordFile timerFile=new TimerRecordFile("pool.tablename","Rate_master","getView",t.duration());
			return sbrProperty.append("\n"+Field);
	
	}
	
	
	/*@Override
	public Hashtable<Object, Object> setPreprocess() 
	{	
		ExecutionTimer t = new ExecutionTimer();
		 t.start();SELECT * FROM retailcopy.property_details p where pv=10765
//		PREPROCESS LIKE VALIDATION
		Hashtable< Object, Object>error =new Hashtable<Object, Object>();
		Preprocess preprocess;
		try {
			preprocess = new Preprocess();
			preprocess.setDbmanager(sqlDB);
			preprocess.setObject(this);
			preprocess.ProcessPreprocess();
			 error= preprocess.gethashtable();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		System.out.println("The Error Hash Tabel :"+error);
		Hashtable<Object, Object> ErrorMap =new Hashtable<Object, Object>();
		if(error.containsKey("ErrorInput"))
		{
			ErrorMap.clear();
			Hashtable< Object, Object>TEMP = (Hashtable<Object, Object>) error.get("ErrorInput");
			System.out.println("The temp Map is  "+TEMP);
			System.out.println("The temp value Map is  "+TEMP.values());
			ErrorMap.put("ErrorInput",TEMP.values());
			System.out.println("The Error Map is  "+ErrorMap);
		}
		t.end();
		TimerRecordFile timerFile=new TimerRecordFile("pool.tablename","Rate_master","setPreprocess",t.duration());
		
	
		return ErrorMap;
	}*/

	public Hashtable<Object, Object> getBasicHashtable() 
	{
		return (RateMap);
	}

	public Hashtable<Object, Object> getDetailHashtabel() 
	{
		return new Hashtable<Object, Object>();
	}

	public Hashtable<Object, Object> getHashtabel() 
	{
		return gin.ConvertValuetoMasterName(RateMap,process,tableName);
	}

	
	public String getType() 
	{
		return gin.getId("ratemaster");
	}

	public Vector<Object> getpropertyVector() 
	{
		return new Vector<Object>();
	}

	public void setHashtable(Hashtable<Object, Object> table) 
	{
		
	}

	public void setPropertyVector(Vector<Object> propertydetails) 
	{		
		ExecutionTimer t = new ExecutionTimer();
		 t.start();
		this.RateList=propertydetails;
		t.end();
		@SuppressWarnings("unused")
		TimerRecordFile timerFile=new TimerRecordFile("pool.tablename","Rate_master","setNewPropertyVector",t.duration());
	}
	public String getTable() 
	{
		return Request;
	}

	@Override
	public StringBuffer getDelete() {
		// TODO Auto-generated method stub
		return null;
	}

	public void setRateMap(Hashtable<Object, Object> oldTransactionHash)
	{
		ExecutionTimer t = new ExecutionTimer();
		 t.start();
	this.RateMap=oldTransactionHash;
	t.end();
	@SuppressWarnings("unused")
	TimerRecordFile timerFile=new TimerRecordFile("pool.tablename","Rate_master","setNewPropertyVector",t.duration());
		
	}
	public Hashtable<Object, Object> getmasterHashtabel()
	{
		
		return RateMap;
	}
	public void setViewHashtable(Hashtable<Object,Object> hashtable)
	{
		ViewHashtable.putAll(hashtable);
	}
	/*
	
	 public String getProceess() 
	{
		return null;
	}

	 
	 
	
	public void setDBManager(DBManager sqlDB) 
	{
		ExecutionTimer t = new ExecutionTimer();
		 t.start();
		this.sqlDB = sqlDB;
		gin= new GetIdName(sqlDB);		
		t.end();
		TimerRecordFile timerFile=new TimerRecordFile("pool.tablename","Property_details","setDBManager",t.duration());
	}
	
	public void setRequest(String Request) 
	{
		ExecutionTimer t = new ExecutionTimer();
		 t.start();
		this.request=Request;
		t.end();
		TimerRecordFile timerFile=new TimerRecordFile("pool.tablename","Rate_master","setRequest",t.duration());
		
		
	}*/

	
}